/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package facade;

import entity.Empresa;
import entity.TipoUsuario;
import entity.Usuario;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Rodrigo
 */
@Stateless
public class UsuarioFacade extends AbstractFacade<Usuario> {

    @PersistenceContext(unitName = "Epraxis-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UsuarioFacade() {
        super(Usuario.class);
    }

    public Usuario getUsuarioByNombreUsuario(String nombreUsuario) {
        try {
            String sql = "SELECT * FROM USUARIO WHERE USUARIO = '" + nombreUsuario + "'";
            Query query = em.createNativeQuery(sql, Usuario.class);
            Usuario usuario = (Usuario) query.getSingleResult();
            em.refresh(usuario);
            return usuario;
        } catch (Exception e) {
            Logger.getLogger(UsuarioFacade.class.getName()).log(Level.SEVERE, null, e);
            return null;
        }
    }

    public Usuario inicarSesion(String nombreUsuario, String clave) {
        Usuario usuario = getUsuarioByNombreUsuario(nombreUsuario);
        if (usuario == null) {
            return null;
        }

        if (usuario.getClave().equals(clave)) {
            em.refresh(usuario);
            return usuario;
        } else {
            return null;
        }
    }

    public List<Usuario> getListaUsuarioByEmpresa(Empresa empresa) {
        try {
            String sql = "SELECT * FROM USUARIO WHERE EMPRESA = " + empresa.getId();
            Query query = em.createNativeQuery(sql, Usuario.class);
            List<Usuario> listaUsuario = query.getResultList();
            for (Usuario usuario : listaUsuario) {
                em.refresh(usuario);
            }
            return listaUsuario;
        } catch (Exception e) {
            Logger.getLogger(UsuarioFacade.class.getName()).log(Level.SEVERE, null, e);
            return null;
        }
    }

    public Long getCountCursosAsignadosUsuario(Usuario usuario) {
        try {
            String sql = "SELECT COUNT(CURSO) FROM USUARIO_CURSO_ASIGNADO WHERE USUARIO = " + usuario.getId();
            Query query = em.createNativeQuery(sql);
            return (Long) query.getSingleResult();
        } catch (Exception e) {
            Logger.getLogger(UsuarioFacade.class.getName()).log(Level.SEVERE, null, e);
            return (long) 0;
        }
    }

    public int deleteCursosAsignadosUsuario(Usuario usuario) {
        String sql = "DELETE FROM USUARIO_CURSO_ASIGNADO WHERE USUARIO = " + usuario.getId();
        Query query = em.createNativeQuery(sql);
        int filasEliminadas = query.executeUpdate();
        return filasEliminadas;
    }

    public void createTipoUsuarioForUsuario(TipoUsuario tipoUsuario, Usuario usuarioEditar) {
        String sql = "INSERT INTO USUARIO_TIPO_USUARIO(TIPO_USUARIO, USUARIO) VALUES(" + tipoUsuario.getId() + "," + usuarioEditar.getId() + ")";
        Query query = em.createNativeQuery(sql);
        query.executeUpdate();

        usuarioEditar = find(usuarioEditar.getId());

        em.refresh(usuarioEditar);

        System.out.println("sql = " + sql);
    }

    public Usuario getUsuarioByID(Integer id) {
        try {
            Usuario usuario = find(id);
            em.refresh(usuario);
            return usuario;
        } catch (Exception e) {
            return null;
        }
    }

}
